#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int signum)
{
    std::cout<<"receive signal "<<signum<<" i am "<<getpid()<<std::endl;
    while(true){
        ::pid_t rid = waitpid(-1,nullptr,WNOHANG);//等待子进程结束
        if(rid > 0){
            std::cout<<"wait child process "<<rid<<std::endl;
        }
        else if(rid == 0){
            std::cout<<"no child process"<<std::endl;
            break;
        }
        else{
            std::cout<<"wait error"<<std::endl;
            break;
        }
    }
}
int main()
{
    //::signal(SIGCHLD, handler);
    ::signal(SIGCHLD, SIG_IGN);//忽略子进程结束信号
    if(fork()==0){
        std::cout<<"child process"<<std::endl;
        ::sleep(5);
        ::exit(0);
    }
    while(true){
        ::sleep(1);
    }
    return 0;
}
//int flag = 0;
// void change(int signum)//信号处理执行流
// {
//     (void)signum;
//     flag = 1;
// }
// int main()//主执行流
// {   
//     ::signal(2,change);
//     while(!flag);
//     printf("正常退出\n");
//     return 0;
// }
//static int cnt = 0;
// void PrintBlock()
// {
//     sigset_t set,oldset;
//     sigemptyset(&set);//每次清空信号集
//     sigemptyset(&oldset);
//     sigprocmask(SIG_BLOCK,&set,&oldset);
//     //打印老的信号掩码
//     std::cout<<"Block"<<std::endl;
//     for(int signo = 31;signo>0;--signo) {
//         if(sigismember(&oldset,signo)) {//如果信号在旧的掩码中
//             std::cout <<1;
//         }
//         else {
//             std::cout <<0;
//         }
//     }
//     std::cout << std::endl;
// }
// void PrintPending()
// {
//     sigset_t pending;
//     sigemptyset(&pending);
//     ::sigpending(&pending);//获取当前进程的待处理信号集
//     //获取待处理信号集
//     std::cout<<"Pending"<<std::endl;    
//     for(int signo = 31;signo>0;--signo) {
//         if(sigismember(&pending,signo)) {
//             std::cout <<1;
//         }
//         else {
//             std::cout <<0;
//         }
//     }
//     std::cout << std::endl;
// }
// void handler(int signum)
// {
//     cnt++;
//     while(true){
//         PrintBlock();
//         PrintPending();
//         sleep(1);
//         break;
//     }
// }
// int main()
// {
//     struct sigaction act, oldact;
//     act.sa_handler = handler;
//     // //自定义屏蔽信号集
//     // ::sigemptyset(&act.sa_mask);
//     // ::sigaddset(&act.sa_mask, 3);
//     // ::sigaddset(&act.sa_mask, 4);
//     // ::sigaddset(&act.sa_mask, 5);
//     // ::sigaddset(&act.sa_mask, 6);
//     // ::sigaddset(&act.sa_mask, 7);
//     //自定义处理2号信号
//     ::sigaction(2, &act, &oldact);//当发送多个2号信号，操作系统会屏蔽2号信号，并将其保存到队列中，直到收到2号信号的处理程序，才会将其从队列中取出并处理。
//     while(true){
//         PrintBlock();
//         PrintPending();
//         pause();
//     }
//     return 0;
// }
// void handler(int signum)
// {
//     std::cout << "Caught signal " << signum << std::endl;
// }
// int main()
// {
//     // ::signal(2,handler);
//     for(int i=1;i<=31;i++){//设置信号处理函数
//         ::signal(i,handler);
//     }
//     while(true){
//         std::cout << "Hello, world!" << std::endl;
//         ::sleep(1);
//     }
//     return 0;
// }